
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Calculator</title>
    </head>

    <body>

    <h1>Calculator</h1>
    (Ver 1.0 4/11/2012 by Zorayr Khalapyan)<br />
    Type an expression in the following box (e.g., 10.5+20*3/25).

    <p>
        <form method="GET">
            <input type="text" name="expr">
            <input type="submit" value="Calculate">
        </form>
    </p>
    <ul>
        <li>Only numbers and +,-,* and / operators are allowed in the expression.
        <li>The evaluation follows the standard operator precedence.
        <li>The calculator does not support parentheses.
        <li>The calculator handles invalid input "gracefully". It does not output PHP error messages.
    </ul>

    Here are some(but not limit to) reasonable test cases:
    <ol>
      <li> A basic arithmetic operation:  3+4*5=23 </li>
      <li> An expression with floating point or negative sign : -3.2+2*4-1/3 = 4.46666666667, 3+-2.1*2 = -1.2 </li>
      <li> Some typos inside operation (e.g. alphabetic letter): Invalid input expression 2d4+1 </li>
    </ol>
    </body>
</html>

<?php

function check_syntax($str) {

    // define the grammar
    $number = "\d+(\.\d+)?";
    $atom   = "[+-]?($number)";
    $op     = "[+*/-]";
    $sexpr  = "$atom($op$atom)*"; // simple expression

    return preg_match("~^$sexpr$~", $str);
}

if(isset($_GET['expr']) && strlen($_GET['expr']) != 0){

    echo "<h2>Result</h2>";

    $input = $_GET['expr'];

    if(check_syntax($input)){
        echo "$input = ".eval("return @($input);");
    }else{
        echo "Invalid input expression $input.";
    }

}

?>